package com.哈希表;

import java.util.*;

/**
 * 给定两个字符串 s 和 t，判断它们是否是同构的。
 *
 * 如果 s 中的字符可以被替换得到 t ，那么这两个字符串是同构的。
 *
 * 所有出现的字符都必须用另一个字符替换，同时保留字符的顺序。两个字符不能映射到同一个字符上，但字符可以映射自己本身。
 */
public class 同构字符串 {

   static  class Solution {
        public boolean isIsomorphic(String s, String t) {

            if (s.length() != t.length()) {

                return false;
            }
            if (s.equals(t)) {
                return true;
            }

            String[] s1 = s.split("");
            String[] t1 = t.split("");
         Boolean flags = repeat2(s1,t1);
         Boolean flagt = repeat2(t1,s1);
         if(!flags || !flagt){
             return false;
         }
         else{
             return true;
         }


        }
       public Boolean repeat2(String[] s1,String[] t1){
           Map<String,String> maps = new LinkedHashMap<>();
           for(int i = 0;i<s1.length;i++){
               if(maps.containsValue(s1[i])){
                   for(Map.Entry<String,String> entry:maps.entrySet()){
                       if(entry.getValue().equals(s1[i])){
                           int j = Integer.valueOf(entry.getKey());
                           if(!(s1[j]+t1[j]).equals(s1[i]+t1[i])){
                               return false;
                           }
                           break;
                       }
                   }
               }
               maps.put(String.valueOf(i),s1[i]);
           }
           return true;
       }



       public boolean isIsomorphic2(String s, String t) {

            return repeat3(s,t) && repeat3(t,s);
       }
       public Boolean repeat3(String s,String t){

            Map<Character ,Character> map = new LinkedHashMap<>();
            for(int i = 0 ;i<s.length();i++ ){
                char s1 = s.charAt(i);
                char t1 = t.charAt(i);
                if(map.containsKey(s1)){
                    if(!map.get(s1).equals(t1)){
                        return  false;
                    }
                }
                else{
                    map.put(s1,t1);
                }
            }
            return true;

       }


    }

    public static void main(String[] args) {
        Solution solution = new Solution();
        System.out.println(solution.isIsomorphic2("abbaa","cddcd"));
    }
}
